Visual Basic 


1. Tipos de datos y expresiones. 3

1.1. Declaración de variables. 3

1.2. Constantes. 3

1.3. Declaración de matrices. 4

1.4. Expresiones y operadores. 4

2. Estructuras de selección. 6

2.1. Sentencia      IF … THEN … ELSE.. 6

2.2. Estructura    SELECT CASE.. 7

3. Estructuras iterativas. 9

3.1. Instrucción    FOR … TO … NEXT. 9

3.2. Instrucción    DO … LOOP.. 9

4. Controles básicos. 12

3.1. Introducción al uso de controles. 12

3.2. Controles básicos. 13

3.3. Eventos. 20

5. Formularios. 22

5.1. Propiedades. 22

5.2. Utilización de multiples formularios. 24

5.3. Comunicacion entre formularios. 26

6. Contantes y funciones de Visual Basic. 28

6.1. Constantes. 28

6.2. Funciones matemáticas. 29

6.3. Funciones aleatorias. 29

6.4. Funciones de cadenas de caractéres. 29

6.5. Funciones de fechas. 29

6.6. Funciones de comprobación. 29

6.7. Otras funciones. 29

6.8. Las funciones InputBox y MsgBox. 30

7. El editor de menús. 32

1. Tipos de datos y expresiones

1.1. Declaración de variables

Antes de utilizar un dato en nuestros programas, es necesario declararlo. Este dato puede ser variable, con lo cual podrá cambiar de valor a lo largo del programa, o constante, en cuyo caso su valor será el mismo a lo largo de todo el programa y no podrá modificarse. La forma de declarar las variables es la siguiente:

Dim| Public| Static nombre_variable As tipo

Dim: Al declarar una variable con esta palabra estamos diciendo que la variable será local al ámbito en que se declara. Puede ser dentro de un procedimiento o dentro de un formulario; de esta forma no será accesible desde los demás procedimientos o formularios.

Public: Las variables declaradas serán publicas y podrán estar accesibles desde todos los formularios de la aplicación.

Static: Con esta forma de declarar variables conseguiremos que las variables locales no se creen y se destruyan al entrar y salir de los procedimientos donde fueron declaradas sino que se mantenga su valor durante todo el periodo de ejecución de la aplicación. De esta forma al entrar en algún procedimiento las variables recuerdan el valor que tenían cuando se salió de él.

Los tipos de variables que se pueden utilizar en Visual Basic se muestrean en la tabla siguiente.

TIPOS DE VARIABLES

TIPO

COMENTARIO

BOOLEAN

Sólo admite 2 valores: TRUE o FALSE

BYTE

admite valores enteros entre 0 y 255

INTEGER

admite valores enteros entre -32768 y 32767

LONG

valores enteros entre –2.147.483.648 y 2.147.483.647

SINGLE

admite valores decimales con precisión simple

DOUBLE

admite valores decimales de doble precisión

CURRENCY

válido para valores de tipo moneda

STRING

cadenas de caracteres

DATE

fechas, permite operar con ellas

 

Al declarar una variable lo que estamos haciendo es decir al procesador que reserve una posición de memoria para guardar un dato. La cantidad de memoria reservada dependerá del tipo de variable que hayamos indicado. Es importante tener en cuenta que siempre debemos utilizar el tipo de variable más pequeña posible, pues de esta forma estaremos consumiendo la menor cantidad de memoria. Por ejemplo, si queremos crear una variable en la que se guardará la edad de una persona, bastará con que la variable creada al efecto sea de tipo byte.

1.2. Constantes

Una constante es aquel dato que tendrá el mismo valor a lo largo de todo el programa. Para declarar una constante, se procede de la forma siguiente:

Const nombre_constante As tipo = valor

donde nombre_constante es el nombre que queramos dar a la constante, tipo es uno de los tipos de la tabla anterior y valor es el valor que tendrá la constante. El siguiente ejemplo declara una constante llamada PI a la que se asigna el valor 3,1416:

Const PI as Single = 3,1416

1.3. Declaración de matrices

Una matriz es un conjunto de datos del mismo tipo. Supongamos que necesitamos almacenar 10 números enteros; en lugar de crear 10 variables de tipo entero, podemos crear una matriz de 10 elementos. Para declarar matrices debemos colocar entre paréntesis el número de elementos de los que constará a continuación del nombre de la variable; también habrá que indicar el tipo de elementos que va a almacenar la matriz. Todo ello se realiza con la siguiente expresión:

Dim nombre_matriz(dimensión) As tipo

Ejemplo:     Dim medidas(9) as integer

De esta forma tenemos una matriz de 10 elementos identificados del 0 al 9, en la cual se almacenarán números enteros. Para referirnos al quinto elemento de nuestra matriz, habría que escribir medidas(4). (Recuerda que el primer elemento es el de índice 0, el segundo el de índice 1, …). Así por ejemplo, la expresión

medidas(7) =  -5

almacenaría el número –5 en el octavo elemento de la matriz.

Aunque no es lo habitual, podemos obligar a que el primer elemento de una matriz tenga el índice con valor 1. Esto lo haremos colocando la instrucción option base 1 en la sección declarations de nuestro formulario.

También podemos indicar los límites inferior y superior de la matriz:

Dim medidas(5 to 14) as integer                     es una matriz de 10 elementos cuyos índices van del 5 al 14.

Las matrices pueden tener más de una dimensión. Las matrices multidimensionales se declaran de la siguiente forma:

Dim medidas(2, 9) as integer

sería una matriz bidimensional de 30 elementos, agrupados en tres filas y diez columnas. El primer elemento sería el de índice (0, 0) y el último (2, 9). Imagina que queremos hacer el típico juego de los barcos con un tablero de 8 x 8 casillas. Crearíamos una matriz en la que se almacenaría que casilla contiene un barco y cual no de la siguiente forma:

Dim tablero_de_barcos(7, 7) as boolean

Si te has fijado bien habrás podido observar que hemos separado con el símbolo _ las palabras “tablero” “de” “barcos”; ello es debido a que el nombre de una variable no puede estar formado por más de una palabra, por lo que hay que unirlas de alguna forma para hacer creer al ordenador que se trata de una sola palabra.

1.4. Expresiones y operadores

Una expresión es un conjunto de operandos y operadores que una vez evaluados devuelven un resultado. En Visual Basic hay cuatro tipos de operadores: aritméticos, relacionales, lógicos y de texto. Los operadores relacionales son aquellos que devuelven valores de tipo Bolean, es decir, su resultado será Verdadero o Falso.

TIPOS DE OPERADORES

Aritméticos

Relacionales

Lógicos

De texto

Potenciación                            ^

Igual que                      =

Not

&

Negación                                  -

Distinto a                     <>

And

 

Suma y resta                          +, -

Menor que                    <

Or

 

Multiplicación y división          *, /

Menor o igual que        <=

 

 

División entera                         \

Mayor que                     >

 

 

Resto de la división               Mod

Mayor o igual que         >=

 

 

 

Los operadores aritméticos y los relacionales no necesitan mayor aclaración. La función de los operadores lógicos y de texto es la siguiente:

§    Not (expresión)                                     si el resultado de expresión es FALSO lo convierte en VERDADERO, y viceversa.

§    (expresión_1) And (expresión_2)          devuelve VERDADERO si el resultado de las dos expresiones es VERDADERO, y FALSO en caso contrario.

§    (expresión_1) Or (expresión_2)             devuelve VERDADERO si el resultado de alguna de las dos expresiones es VERDADERO, y FALSO en caso contrario.

Unos ejemplos ayudarán a comprender mejor algunos de los distintos operadores:

Expresión

Resultado

 

Expresión

Resultado

4 ^ 3

64

2 + 7 <> 5

VERDADERO

7 / 3

2,33333333

2 + 7 > 9

FALSO

7 \ 3

2

2 + 7 >= 9

VERDADERO

7 mod 3

1

Not (3 < 5)

FALSO

 

 

(2 + 3 < 8) And (3 < 5)

VERDADERO

“buen” & “día”

“buendía”

(2 + 3 < 8) Or (3 < 5)

VERDADERO

 

Ejercicios:

1)     Indica como se declararía una variable que almacenase los siguientes datos:

a)  El año de nacimiento de una persona.

b)  El resultado de una ecuación de un ejercicio de física.

c)  Saber si una persona es mayor de edad.

d)  La ciudad de residencia de una persona.

e)  El número de hijos de una persona.

2)     Escribe la expresión que declara una constante de valor “ZAMORA”.

3)     Queremos crear una matriz en la que se van a almacenar las medidas (ancho, alto y largo) de un automóvil, en milímetros y sin decimales. ¿Cómo se declararía la matriz que contuviese estos datos?

4)     Indica el resultado de las siguientes expresiones:

a)  (2 + 5) ^ 2

b)  Not (( 19 Mod 5) < 7)

c)  “Hola“ & “ “ & “amigos”

d)  18 > 11 And (( 5 \ 3 ) <> 1)

e)  18 > 11 Or (( 5 \ 3 ) <> 1)

2. Estructuras de selección

Hay ocasiones en las que un programa debe realizar distintas acciones dependiendo del valor de una condición. En estos casos, disponemos de 2 tipos de sentencias para realizar selecciones dependiendo del valor de una expresión o de una variable:

2.1. Sentencia         IF … THEN … ELSE

La estructura general de esta sentencia es la siguiente:

If condición then

bloque de sentencias a realizar si la condición es cierta

Else

bloque de sentencias a realizar si la condición es falsa

End If

Supongamos que queremos crear un programa que nos diga si somos mayores o menores de edad. El código de dicho programa sería el siguiente:

If edad < 18 Then

print “menor de edad”

Else

print “mayor de edad”

End If

Se pueden colocar todas las sentencias de código que queramos en cada uno de los bloques de sentencias, siempre que cada sentencia vaya en una línea distinta. Si los bloques de sentencias están formados por una sola instrucción podemos utilizar la versión reducida que ocupa una sola línea:

If condición then sentencia else sentencia

Ejemplo:          If IsNumeric(número) then a = número else print “Error”

En el ejemplo anterior, si la variable número contiene un valor numérico, este es almacenado en la variable a; en caso contrario el programa imprimirá en pantalla el mensaje “Error”.

También podemos anidar varias sentencias If then Else cuando una de las 2 opciones iniciales contiene a su vez 2 bifurcaciones dependiendo del estado de otra condición:

If edad < 18 Then

print “menor de edad”

Else

If edad < 65 Then

print “adulto”

Else

print “tercera edad”

End If

End If

Este último ejemplo podría haberse escrito de otra forma utilizando la cláusula ElseIf:

If edad < 18 Then

print “menor de edad”

ElseIf edad < 65 Then

print “adulto”

Else

print “tercera edad”

End If

Podemos introducir tantas líneas ElseIf como queramos siempre antes del último Else, si es que lo necesitamos.

Para múltiples decisiones, normalmente más de 3, en las que dependiendo del valor de una variable queremos que se realice una acción distinta, no conviene utilizar la estructura If Then, sino que el código queda más claro y resulta más fácil de modificar utilizando la sentencia Select 

 

2.2. Estructura       SELECT CASE

Esta sentencia permite realizar operaciones diferentes dependiendo del valor de una variable. Su estructura general es la siguiente:

Select Case dato

Case valor1

bloque de sentencias

case valor2

bloque de sentencias

Case valor3

bloque de sentencias

Case Else

bloque de sentencias, se ejecutan si no se cumple ninguno de los valores anteriores

End Select

En esta construcción, dependiendo del valor de la variable dato se ejecutará un bloque de sentencias diferente. Los valores que podemos colocar en lugar de valor1, valor2, valor3 no sólo se limitan a valores constantes como números y cadenas de texto, sino que podemos comparar con un número como podemos ver en el siguiente ejemplo, en el que tenemos una variable de tipo single llamada NotaFinal en la que está guardada la nota de un alumno:

Select Case NotaFinal

Case Is < 5

print “Suspenso”

Case Is < 6

print “Suficiente”

Case Is < 7

print “Bien”

Case Is < 9

print “Notable”

Case Else

print “Sobresaliente”

End Select

Como podemos observar si utilizamos los operadores lógicos como >, <, =, <=, >= debemos anteponer el operador Is. Si lo que hacemos es comparar con un intervalo de valores colocaremos el operador to entre los limites del intervalo.

Case 5 to 5.99

print “suficiente”

También podemos realizar comparaciones con un conjunto de valores separados por comas:

Case 1, 3, 5

print “el numero es impar”

 

Ejercicios:

1)  Escribe un programa que imprima la palabra GRANDE si un número es mayor o igual que 1000 y PEQUEÑO en caso contrario.

2)  Un programa debe indicar si un número es positivo, negativo o cero. ¿Cuál será su código?

3)  Indica como sería el código de un programa en el que a partir del valor numérico del mes nos dijese en que estación del año nos encontramos.

4)  Indica como se escribiría el código en el que a partir del valor numérico del mes nos dijese el nombre del mes en que nos encontramos.

 

3. Estructuras iterativas

3.1. Instrucción      FOR … TO … NEXT

Sirve para ejecutar un bloque de sentencias un número conocido de veces. La sintaxis de esta instrucción es

For contador = inicio To fin [Step incremento]

bloque de sentencias

Next [contador]

Contador es la variable numérica que se incrementa cada vez que se ejecuta el bucle. Este se realizará un número determinado de veces que vendrá determinado por los valores de inicio y de fin. Los argumentos entre corchetes son opcionales. Si no se indica incremento, éste se presupone que vale 1. En cualquier momento podemos abandonar la ejecución en mitad del bucle si dentro del bloque de sentencias colocamos la instrucción Exit For.

Unos cuantos ejemplos ayudarán a comprender mejor esta instrucción:

For i = 1 to 5

   Print i

Next i

 Imprime en pantalla los números 1 a 5

For i = 0 to 10 step 2

   Print i

Next i

 Imprime en pantalla los números 0, 2, 4, 6, 8 y 10

For i = 10 to 2 step -2

   Print i

Next i

 Imprime en pantalla los números 10, 8, 6, 4 y 2

Hay que tener cuidado con no crear un bucle que no se acabe nunca. Por el ejemplo, el siguiente bucle For no se terminaría nunca, pues si comenzamos en el número 10 y aumentamos una unidad cada vez que el bucle se repita, nunca llegaremos al número 5.

 

For i = 10 to 5

      Print i

Next i

3.2. Instrucción      DO … LOOP

En las estructuras anteriores, conocíamos de antemano el número de veces que iba a repetirse el bucle; en algunas ocasiones no podemos conocer cuantas veces debemos repetir una determinada instrucción (por ejemplo al pedir una clave secreta; habrá que repetir la petición de la misma hasta que la clave introducida sea correcta). En estos casos utilizaremos la instrucción Do … Loop. Se ejecutará un bloque de código mientras o hasta que la condición evaluada sea verdadera. Dependerá de la forma en la que escribamos la instrucción. Por lo tanto la sintaxis de esta estructura puede adoptar alguna de las siguientes formas:

 

Estructura

Explicación

Do While condición

bloque de sentencias

Loop

El bloque de sentencias se ejecuta mientras se cumpla la condición. Puede ocurrir que dicho bloque no se ejecute ninguna vez.

Do

bloque de sentencias

Loop While condición

El bloque de sentencias se ejecuta mientras se cumpla la condición. Dicho bloque se ejecutará al menos una vez.

Do Until condición

bloque de sentencias

Loop

El bloque de sentencias se ejecuta hasta que se cumpla la condición. Puede ocurrir que dicho bloque no se ejecute ninguna vez.

Do

bloque de sentencias

Loop Until condición

El bloque de sentencias se ejecuta hasta que se cumpla la condición. Dicho bloque se ejecutará al menos una vez.

 

En cualquier momento podemos abandonar la ejecución en mitad del bucle si dentro del bloque de sentencias colocamos la instrucción Exit Do.

Veamos algunos ejemplos del uso de estas sentencias:

i = 2

Do While i < 8

   Print i

   i = 2 + i

Loop

 Imprime en pantalla los números 2, 4 y 6

i = 3

Do

   Print i

   i = 2 * i

Loop While i <= 12

 Imprime en pantalla los números 3, 6 y 12

i = 2

Do Until i >= 16

   Print i

   i = i ^ 2

Loop

 Imprime en pantalla los números 2 y 4

i = 10

Do

   Print i

   i = i - 1

Loop Until i < 7

 Imprime en pantalla los números 10, 9, 8 y 7

 

Hay que tener cuidado con no crear un bucle infinito, es decir, un bucle que no termine nunca, como por ejemplo los siguientes:

i = 2

Do While i > 0

      Print i

      i = i + 2

Loop

Como i siempre es mayor que 0, el bucle no terminará nunca y el programa imprimirá en pantalla todos los números pares, hasta el infinito.

También puede ocurrir lo contrario, es decir, que creemos un bucle que no se ejecute nunca:

i = 2

Do While i < 0

      Print i

      i = i + 2

Loop

Como i no es menor que 0, el bucle nunca se ejecutará.

 

Ejercicios:

1)    Escribe el código de un programa que imprima en pantalla los números del 1 al 10 junto a su cuadrado.

2)    Un programa debe imprimir todos los números impares en orden descendente entre el 100 y el 10. ¿Cuál será su código?

3)    Queremos calcular la suma de los números comprendidos entre 11 y 20, a. i. Escribe el código correspondiente.

4)    Escribe el código que imprime todos los números junto a su cubo, comenzando por el 1, hasta que ese cubo sea superior a 5.000.

 

4. Controles básicos

3.1. Introducción al uso de controles

Los controles son objetos que disponen de sus propias propiedades y métodos, y cuya utilidad es la de facilitarnos el desarrollo de nuestras aplicaciones. Lo único que tendremos que hacer es modificar sus propiedades (tamaño, color, etc..) para incorporarlos en nuestros programas y asociarles el código necesario para que se comporten como esperamos al ejecutar la aplicación.

Por ejemplo, el botón Aceptar que encontramos en multitud de programas es un control.

Antes de empezar a conocer los controles básicos veamos cuales son sus características generales:

·       Propiedades: Todos los controles disponen de una serie de propiedades las cuales podemos cambiar al incluirlos en nuestras aplicaciones. Ejemplos de propiedades son el color, el tipo de letra, el nombre, el texto, etc...

·       Métodos: Son procedimientos asociados a los controles, es decir, rutinas ya establecidas que podemos invocar desde nuestras aplicaciones para que se realice alguna operación sobre el control. Por ejemplo el control ListView (la lista de archivos que aparece en el explorador de Windows) dispone del método Order que te ordena los datos aparecidos en la lista.

·       Eventos: Son acciones que pueden ser motivadas por el propio usuario o por el mismo sistema operativo. Ejemplos pueden ser el movimiento del ratón o hacer click sobre un botón. No necesitamos detectar cuando se ha producido un evento determinado, Windows lo detecta automáticamente. Los eventos ya están definidos, son bastantes y cada control cuenta con los suyos propios, aunque son muy parecidos. Lo único que tendremos que hacer es asociar el código necesario al evento que necesitemos tratar.

   La ventana donde aparecen los controles que Visual Basic carga por defecto nada más arrancar la aplicación aparece en la figura adjunta. Moviendo el ratón por encima de cualquier control aparecerá un ‘ToolTipText’ indicándonos el control de que se trata.

   Cuando vayamos a utilizar un control en nuestro formulario, tendremos que darle un nombre. Aunque podemos poner el nombre que deseemos a un control, el nombre que le demos deberá estar relacionado con la función que realizará el control; además, es conveniente que indique el tipo de control de que se trata. Existe una convención ampliamente aceptada que es la siguiente: se utilizan siempre tres letras minúsculas que indican el tipo de control, seguidas por otras letras (la primera mayúscula, a modo de separación) libremente escogidas por el usuario, que tienen que hacer referencia al uso que se va a dar a ese control. La tabla siguiente muestra las abreviaturas de los controles más usuales, junto con la nomenclatura inglesa de la que derivan:

                  


      cmb      ComboBox

      chk       CheckBox

      cmd      CommandButton

      frm        Form

      fra         Frame

      img       Image

      lbl         Label

      lin         Line

      mnu      Menu

      opt        OptionButton

      pic        PictureBox

      shp       Shape

      txt         TextBox

      tmr        Timer


 

   Así por ejemplo, el botón Aceptar que comentamos antes podría tener en el formulario el nombre  cmdAceptar.

 

3.2. Controles básicos

Hay una serie de propiedades que son comunes a la mayoría de los controles. Son las siguientes:

Name: es el nombre con el que se conocerá el control cuando lo utilicemos en el código. En un mismo formulario no puede haber 2 controles con el mismo nombre. Conviene poner un nombre que represente la función que tiene el control en la aplicación para que el código quede más claro.

Alignment: alineación que tendrá el texto dentro del control: izquierda, centro o derecha.

Appearance: aspecto del control: 3D o plano.

BackColor: color del fondo del control.

BorderStyle: es el tipo de contorno para el control, el estilo del borde.

Caption: Es el texto que contendrá el control. Esta propiedad no existe en el control TextBox.

Enabled: establece si un control está habilitado para su modificación por parte del usuario o no. Si un control no está habilitado, es decir, tiene la propiedad Enabled establecida en False, su color aparece un poco difuminado para indicar que no se puede utilizar ese control en ese momento. En la figura anterior podemos ver un menú con una opción habilitada y dos deshabilitadas.

Font: tipo y tamaño de letra que usa el control.

ForeColor color de la letra del control.

Heigth: altura del control.

Left: distancia entre el borde izquierdo de un objeto y el borde izquierdo de su contenedor.

TabIndex: es el orden que ocupa el control cuando se va pasando de uno a otro mediante la tecla  tabulador.

ToolTipText: Aquí indicaremos el texto que se mostrará cuando el ratón se sitúe sobre el control. Este texto puede servir de aclaración o ayuda sobre la función de dicho control. En la figura adjunta podemos ver el ToolTipText que aparece al dejar el puntero del ratón sobre el botón Abrir.

Top: distancia entre el borde superior de un objeto y el borde superior de su contenedor.

Visible: Devuelve o establece un valor que determina si el control es visible. Por ejemplo para ocultar un control podemos establecer el valor de esta propiedad a False.

Width: anchura del control.

 

TextBox 

Mediante este control podremos realizar tanto la entrada como la salida de datos en nuestras aplicaciones. Las propiedades de las que dispone el control (además de las generales de todos los controles) son las siguientes:

CausesValidation: Esta propiedad sirve para indicar si queremos que al abandonar el control se genere un evento Validate. Desde el método correspondiente a dicho evento se deberá comprobar el valor introducido en el TextBox, permitiéndose así o no la salida. Esta propiedad podrá tener el valor True o False.

MaxLength: número de caracteres máximo que puede contener el texto introducido en el TextBox. Cuando estamos introduciendo texto y llegamos al máximo nos alerta con un pitido.

MultiLine: permite que el control tenga varias líneas de edición. Esta propiedad podrá tener el valor True o False.

Locked: Si está con valor True bloquea el control, es decir, el usuario no puede introducir ni modificar el texto que contenga. Nos puede servir para utilizar el control como salida de datos sin que el usuario pueda modificarlos por error.

Text: Es la propiedad equivalente a Caption en los demás controles. Aquí indicamos el texto que aparecerá en el control. Podemos asignarle cualquier texto en el momento de diseñar el programa o durante la ejecución del mismo. También podemos leer el texto que haya introducido el usuario para tratarlo durante la ejecución del programa.

 

Label      

Su utilidad queda restringida a la visualización de datos en el programa, no permitiendo la introducción de datos por parte del usuario. Este control sirve para mostrar mensajes en nuestro formulario que orienten al usuario sobre la utilidad de los demás controles que tengamos en la aplicación o para indicarnos acciones que podemos realizar. Sus propiedades son las comunes a los demás controles, aunque podemos mencionar aquí la propiedad

AutoSize: Hace que el tamaño de la etiqueta se ajuste automáticamente a la longitud del texto que contiene.

Para este control no se suelen utilizar los eventos ya que su contenido suele cambiar poco a lo largo de la ejecución de la aplicación. A este control no se le puede dar el enfoque (al pulsar la tecla tabulador nunca nos podremos colocar sobre este control).


Antes de seguir comentando otros controles, podemos ver en la figura siguiente algunos de ellos.

 


 CommandButton  

Este control es el típico botón que aparece en todas las aplicaciones y que al hacer click sobre él nos permite realizar alguna operación concreta. Según el código que le asociemos podremos realizar las operaciones que queramos. El evento por excelencia de este control es click. Sus propiedades son:

Cancel: si esta propiedad tiene el valor True quiere decir que se trata del botón de cancelación. Ello implica que al pulsar la tecla Escape se ejecutará el código asociado al evento click de dicho botón, independientemente de donde se encuentre el foco en ese momento.

Default: si esta propiedad tiene el valor True quiere decir que se trata del botón por defecto. Ello implica que al pulsar la tecla Intro se ejecutará el código asociado al evento click de dicho botón, independientemente de donde se encuentre el foco en ese momento.

Picture: Podemos escoger una imagen que aparecerá sobre el botón.

DisablePicture: es la imagen que se mostrará en el botón cuando éste se encuentre deshabilitado, es decir, cuando su propiedad Enabled sea False.

DownPicture: imagen que mostrará el botón cuando esté pulsado.

NOTA: Para poder utilizar las tres propiedades anteriores es necesario que la propiedad Style esté en el valor Graphical; en caso contrario el botón no podrá contener dibujos.

Style: Esta propiedad puede tomar dos valores: Standard o Graphical.

Value: dando a esta propiedad desde el código del programa el valor True, se generará el evento Click. Por lo tanto se trata de una forma de activar el botón desde el código, igual que si se hubiese pulsado el ratón o el teclado.

 

CheckBox   

El control CheckBox es una casilla de verificación en la que únicamente cabe la posibilidad de que se encuentre marcada o desmarcada. Su principal propiedad es:

Value: el valor será Checked cuando la casilla de verificación se encuentre marcada y Unchecked cuando esté desmarcada.

 

OptionButton   

Este control nos permite elegir una opción entre varias de las que se nos plantean. Cada opción será un control OptionButton diferente. Observa la figura del ejemplo de más abajo. De todas las opciones que se nos ofrece, sólo podremos activar una. Si activamos cualquier otra opción, se desactivará automáticamente la última que teníamos activada.

El marco que está alrededor de los 6 controles OptionButton se trata del control Frame , es opcional, aunque es conveniente colocarlo siempre que hagamos uso de las opciones. No sólo por motivos de presentación sino porque de esta manera podremos establecer grupos de controles OptionButton independientes en los que en cada grupo sólo pueda haber una opción activada a la vez. También, al mover el marco se moverán los controles incluidos en él facilitándonos las modificaciones.

Para que los controles OptionButton queden englobados dentro de un control Frame, primero tendremos que colocar el control Frame en el formulario con el tamaño adecuado y después ir colocando los controles Optionbutton dentro del Frame. Del control Frame la única propiedad que nos interesará es Caption, que es el texto que aparecerá en el encabezado.

La propiedad más importante del control OptionButton es

Value: Es el valor que tendrá el control: True si se encuentra activado y False si no lo está.

No se suele asociar código a los eventos de este tipo de controles, sino únicamente conocer el valor que tienen: True o False.

EJEMPLO

Para practicar vamos a realizar una aplicación que consistirá en realizar con 2 números que introduzcamos, una operación que seleccionemos y mostrar el resultado. El formulario donde estarán todos los controles es el que aparece en la figura adjunta.

La propiedad Caption de cada uno de los controles es la que se muestra en el formulario.

Se ha modificado la propiedad Name de cada control para que al utilizarlos desde el código sepamos cual es el control con el que trabajamos:

·       Los controles TextBox tienen los nombres: Num1, Num2 y Resul.

·       Los controles Optionbutton tienen cada uno de ellos el mismo nombre que su caption

·       Los controles CommandButton tienen los nombres: Calcular, Limpiar y Salir.

·       A los controles Label y al Frame no hace falta cambiarles el nombre.

Lo que habrá que hacer ahora es asociar código a cada uno de los botones que es de donde se van a realizar las operaciones:

·       Para el botón Calcular, que es el que nos mostrará el resultado según la operación seleccionada, hemos utilizado la instrucción If Then Else.

Private Sub Calcular_Click()

Dim r, a, b As Double

a = Num1.Text

b = Num2.Text

r = 0

 

If suma.Value = True Then

  r = a + b

ElseIf resta.Value = True Then

  r = a – b

ElseIf producto.Value = True Then

  r = a * b

ElseIf division.Value = True Then

  r = a / b

ElseIf potencia.Value = True Then

  r = a ^ b

End If

 

Resul.Text = r

End Sub

 

·       El botón Limpiar Datos nos va a servir para borrar los datos introducidos por el usuario y el resultado preparando. El código que tendremos que introducir es el siguiente:

Private Sub Limpiar_Click()

Num1.Text = “”

Num2.Text = “”

Resul.Text = “”

End Sub

 

·       El botón Salir únicamente contendrá la sentencia End.

Private Sub Salir_Click()

End

End Sub

Nota: el comando End hace que un programa finalice.

 

Image       

Este control lo utilizaremos cuando necesitemos visualizar una imagen en nuestro programa. Para ello haremos uso de las dos propiedades siguientes:

Picture: determina la imagen que se debe mostrar en el control. Esta propiedad contendrá la dirección del archivo donde está almacenada la imagen. Si la imagen ha de cargarse en tiempo de ejecución, habrá que hacer uso de la función LoadPicture de la siguiente forma:

Image1.Picture = LoadPicture("c:\mis documentos\dibujo.bmp")

Stretch: si esta propiedad está establecida a False, el control se redimensionará al cargar la imagen, adaptándose al tamaño de esta. Si el valor es True, será la imagen la que se adapte al tamaño del control.

 

PictureBox    

El control cuadro de imagen es como un control Image ampliado; además de poder visualizar imágenes nos permite dibujar puntos, líneas, rectángulos, círculos, etc... Dentro de él pueden colocarse incluso otro tipo de controles. Las propiedades más importantes son:

Picture: determina la imagen que se debe mostrar en el control.

AutoSize: automatiza el tamaño del control a la imagen, es decir, aquel se ajustará al tamaño de la imagen que ha de contener.

FillColor: Color que se utilizará como relleno cuando se dibujen formas en el formulario utilizando los métodos Line o Circle.

FillStyle: Tipo de relleno que se dará a las formas que se dibujen en el formulario utilizando los métodos Line o Circle.

Existen una serie de métodos que nos van a permitir realizar determinados dibujos dentro de un PictureBox. Son los siguientes:

 

Pset (x, y), color                      Dibuja un punto en la posición dada por las coordenadas X e Y. El color vendrá dado por el valor de la variable color.

Line (x, y) - (z, w), color         Dibuja una línea entre los puntos (X, Y) y (Z, W) con el color especificado.

Line (x, y) - (z, w), color, B    Dibuja un rectángulo cuyas esquinas superior izquierda e inferior derecha serán respectivamente los puntos de coordenadas (X, Y) y (Z, W). El color del borde está dado por el valor de color.

Circle (x, y), radio, color         Dibuja un círculo con centro el punto (X, Y).

Cls                                          Borra el contenido del PictureBox.

 

Todos los métodos anteriores funcionan igualmente sobre el formulario. Si queremos que los dibujos se realicen sobre un PictureBox tendremos que anteponer el nombre de este antes de todos los métodos, separados por un punto.

En aquellos en los que sea posible, el tipo de relleno y el color del mismo estarán determinados por los atributos establecidos en FillStyle y en FillColor. El estilo de las líneas (continuas, discontinuas) y su grosor se establecen mediante las propiedades DrawWidth y DrawStyle.

El siguiente ejemplo hace uso de uno de estos métodos.

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _

                          X As Single, Y As Single)

    If Button = 1 Then PSet (X, Y), vbBlue

End Sub

El ejemplo anterior irá pintando de color azul aquellos puntos por los que vaya pasando el ratón, siempre que tengamos pulsado el botón primario del mismo. Esto es así porque la condición If hace que el método Pset sólo se ejecute si la variable Button (variable que determina que botón del ratón está pulsado en cada momento) vale 1. El valor de Button será 0 si no se encuentra pulsado ningún botón, 1 si el botón pulsado es el primario y 2 si es el secundario.

 

Line      y   Shape  

Estos dos controles son de los más simples que podemos encontrar en Visual Basic. Se utilizan para dibujar líneas el primero de ellos y para dibujar distintas figuras o polígonos el segundo. Son controles estáticos, pues no pueden responder a ningún tipo de evento. Las propiedades características a ambos controles son:

BorderColor: color de la línea o color del borde que delimita la figura.

BorderStyle: estilo de la línea o del borde: continuo, discontinuo, etc...

BorderWidth: anchura de la línea o del borde de la figura.

Además de estas, hay otras propiedades características de cada control. Las propias del control Line son:

X1, X2, Y1, Y2: Estas cuatro coordenadas determinan los puntos origen y final de la línea. Recordar que en informática el origen de coordenadas se corresponde con la esquina superior izquierda.

El control Shape tiene estas propiedades características:

FillColor: color de relleno de la figura.

FillStyle: el valor de esta propiedad determinará el tipo de relleno que tendrá la figura. Este puede ser sólido, transparente, con líneas horizontales, verticales, ...

Conviene recordar ahora que habíamos dicho que existían dos propiedades comunes a todos los controles que eran BackColor y BackStyle, y que tenían una función semejante a la que estamos describiendo para FillColor y FillStyle. Si en un Shape tenemos activadas las dos opciones, el color que prevalecerá como color de relleno será el que esté indicado en la propiedad FillColor.

Shape: propiedad cuyo valor sirve para especificar que figura se dibujará. Los valores posibles son 0 (rectángulo), 1 (cuadrado), 2 (óvalo), 3 (círculo), 4 (rectángulo redondeado) y 5 (cuadrado redondeado).

 

ComboBox    

Este control es una lista desplegable donde el usuario puede seleccionar una de las posibles opciones que aparecen cuando desplegamos la persiana.

El control ComboBox posee dos listas, una visible, que es la que se despliega, y otra no visible. La información de la lista visible se guarda en la propiedad List. El primer elemento de la lista está almacenado en la propiedad List(0), el segundo elemento en List(1) y así sucesivamente. El primer elemento de la lista tiene el subíndice 0. La propiedad ListCount contiene el número de elementos que existen en la lista desplegable. El último elemento de la lista tiene el subíndice ListCount – 1.

Como dijimos este control posee una lista adicional no visible. Los elementos de esta lista no visible se almacenan en la propiedad ItemData; ItemData(0) para el primero, ItemData(1) el segundo, etc. Esta propiedad solo admite números enteros.

Cuando hacemos clic sobre una de las opciones de la lista, se muestra en la ventana de control. La propiedad Text almacena el contenido de esa ventana; es decir, Text guarda la misma información que la propiedad List(n), donde n es el subíndice del elemento seleccionado. La propiedad ListIndex contiene el subíndice del elemento seleccionado, o sea n. Cuando la ventana superior de la persiana no contiene nada, la propiedad Text está vacia y ListIndex alamacena –1.

Si necesitamos que además la aplicación haga algo al seleccionar una opción de la lista, podemos programar el evento Click del control.

El método AddItem inserta un nuevo elemento en la lista. La propiedad NewIndex contiene el índice del último elemento que hemos insertado.

Como propiedades características de este elemento de control podemos destacar:

List: Podemos añadir los Items de la lista no en el momento de ejecución del programa, sino en el momento de su creación. Para ello accedemos a esta propiedad y vamos escribiendo los distintos elementos que queremos que salgan al desplegar la lista. Una vez escrito el primero de ellos, para seguir añadiendo elementos debemos pulsar Ctrl+Intro.

Sorted: permite especificar si los elementos de la lista aparecerán ordenados alfabéticamente.

Style:  existen tres posibles estilos para el ComboBox:

0 (Dropdown Combo)      Este estilo hace que el texto del ComboBox pueda seleccionarse de la lista o bien escribirse directamente sobre el mismo.

1 (Simple Combo)            No aparece la flecha que nos permite desplegar la lista, por lo que no podremos escoger los elementos de la misma. Simplemente se nos permitirá escribir directamente sobre el control como si se tratase de un control TextBox.

2 (Dropdown List)            No es posible escribir directamente sobre el control; únicamente pueden escogerse los elementos de su lista.

 

Timer     

Este control funciona de forma distinta a los demás pues no aparece en el formulario durante la ejecución del programa; sólo lo veremos en el proceso de diseño. Se utilizará cuando queramos que una o varias sentencias se ejecuten de forma repetida a lo largo del desarrollo del programa. La propiedad característica de este control es Interval. Esta contendrá el valor, en milisegundos, que especifica cada cuanto tiempo deben ejecutarse las sentencias incluidas en el código asociado al control. Para detener la ejecución del código asociado al control bastará con establecer el valor de la propiedad Interval a 0. Por ejemplo, si queremos que un programa emita un pitido cada segundo deberemos escribir el siguiente código

Private Sub tmrTemporizador_Timer()

    Beep

End Sub

además de tener la propiedad Interval del temporizador establecida en 1000.

 

 

HScrollBar y VscrollBar       

   Son las típicas barras de desplazamiento horizontal y vertical que aparecen en multitud de programas. Las propiedades a destacar de estas barras son:

Value: valor que indica la posición en la que se encuentra el indicador de desplazamiento de la barra. Este valor estará comprendido entre los valores Max y Min.

Max: valor máximo que podrá tomar la propiedad Value.

Min: valor mínimo que podrá tomar la propiedad Value.

SmallChange: esta propiedad indica cuantas unidades cambiará Value al hacer click en una de las flechas de los extremos de la barra de desplazamiento.

LargeChange: número de unidades que cambiará el valor de Value al hacer click dentro de la barra de desplazamiento.

 

3.3. Eventos

Los eventos son acciones que se pueden realizar en cualquier control: click, doble click, movimiento del ratón,… A estos eventos se les puede asociar código para que se ejecute al producir el evento. Los eventos más habituales son:

MouseMove: al mover el ratón por encima del control.

MouseDown: al pulsar cualquier botón del ratón.

MouseUp: al soltar cualquier botón del ratón.

Los tres eventos anteriores poseen los cuatro parámetros siguientes: Button, Shift, X e Y. Cada uno de ellos toma los siguientes valores:

                     Button:     toma el valor 0 si no se aprieta ningún botón del ratón, el valor 1 si el botón que se aprieta es el primario, el valor 2 si el botón pulsado es el secundario y 4 si se pulsa el botón central del ratón.

                         Shift:     nos indica si al pulsar el ratón teníamos pulsada alguna de las teclas Shift, Ctrl, Alt o AltGr. Sus posibles valores son los siguientes:

0          si no está pulsada ninguna de estas teclas,

1          está pulsada la tecla Shift,

2          está pulsada la tecla Ctrl,

4                    pulsada la tecla Alt,

6          pulsada la tecla AltGr.

                      X e Y:     guardan el valor de las coordenadas X e Y en las que se encontraba el puntero del ratón en el momento de producirse el evento.

   Veamos un ejemplo del uso de uno de estos controles:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 1 Then

Print "Has pulsado el botón primario en la posición " & X & ", " & Y

       ElseIf Button = 2 Then

Print "Has pulsado el botón secundario en la posición " & X & ", "& Y

Else

Print "Has pulsado el botón central en la posición " & X & ", " & Y

       End If

End Sub

Si pulsamos uno de los botones del ratón, el programa imprimirá en pantalla cual de ellos era y la posición en la que lo hemos hecho.

Change: al cambiar el contenido del control, por ejemplo al escribir algo en un TextBox.

Click: al hacer click con el botón izquierdo del ratón sobre el control.

DblClick: al hacer doble click con el con el botón izquierdo del ratón sobre el control.

KeyDown: al presionar una tecla en el teclado. Este evento tiene dos parámetros: KeyCode, que se corresponde con un código numérico que dependerá de la tecla pulsada, y Shift , que valdrá 1 o 0 dependiendo respectivamente de si se encuentra pulsada o no la tecla Shift.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

    Print KeyCode, Shift

End Sub

 

KeyUp: semejante al anterior, salvo que este evento se genera al soltar la tecla que teníamos presionada.

KeyPress: al pulsar una tecla del teclado y mantenerla pulsada. Es un evento parecido a KeyDown, aunque dispone de un solo parámetro, KeyAscii. Este parámetro es particular de cada carácter, y es un número entre 0 y 255 que nos informa del carácter pulsado. (Aunque parezca igual que el parámetro KeyCode del evento KeyDown, no son lo mismo. KeyAscii diferencia entre pulsar “a” o pulsar “A”, mientras que KeyCode no). El siguiente ejemplo imprime el carácter pulsado.

Private Sub Form_KeyPress(KeyAscii As Integer)

 Print Chr(KeyAscii)

End Sub

 

Gotfocus: este evento se activa cuando el control recibe el enfoque, es decir, cuando se activa el control en tiempo de ejecución para introducir datos en él o realizar alguna operación.

Lostfocus: Es el contrario del anterior evento, se activa cuando el control pierde el enfoque, es decir, se pasa a otro control para seguir introduciendo datos.

5. Formularios

Los formularios son tratados como controles con sus propiedades, eventos y métodos. Aunque digamos que se trata de un control especial que utilizamos para contener los controles más usuales con los que construiremos nuestras aplicaciones: TextBox, Label, CommandButton, etc... Vamos a ver las propiedades y eventos más importantes de los formularios, como trabajar con múltiples formularios y como se establece la comunicación entre ellos.

Mientras que los formularios con los atributos por defecto son ventanas de las que se utilizan en todas las aplicaciones Windows, cuando se les inhabilita los botones de minimizar y maximizar junto con la característica de ser redimensionables tenemos una ventana a la que se denomina cuadro de diálogo. Estos se caracterizan por tener unas dimensiones fijas (p. e., no se puede redimensionar el cuadro de diálogo “Imprimir” que se muestra al ejecutar el comando del mismo nombre en cualquier programa Windows) y un atributo adicional, el de ser modales o no modales. Un cuadro de diálogo es modal cuando se muestra sobre todas las demás ventanas de la aplicación y no se puede realizar ninguna otra operación en tanto no se cierre dicho cuadro de diálogo. Será no modal en caso contrario.

 5.1. Propiedades

Las propiedades más comunes de los formularios y que son similares al resto de los controles son:

Name: Nombre del formulario, necesario para llamar al formulario desde el código.

Caption: Texto que aparece en el título del formulario

Backcolor: Color de fondo del formulario.

Forecolor: Color del texto del formulario.

FillColor: Color que se utilizará como relleno cuando se dibujen formas en el formulario utilizando los métodos Line o Circle que vimos anteriormente.

FillStyle: Tipo de relleno que se dará a las formas que se dibujen en el formulario utilizando los métodos Line o Circle.

 Otras propiedades que son propias de los formularios son:

WindowState: Nos permite indicar el modo en el que aparecerá el formulario cuando sea llamado. Tiene tres posibles valores:

0 – Normal                   1 - Minimizado.                     2 - Maximizado.

MinButton y MaxButton: Son dos propiedades que admiten únicamente los valores True o False. Permiten que queden habilitados los botones minimizar y maximizar, respectivamente de un formulario. Nos sirven para controlar que el usuario no pueda cambiar el tamaño en que presentemos un formulario en pantalla. Si sólo desactivamos una de las propiedades, el botón correspondiente aparecerá desactivado, pero si desactivamos las dos propiedades, no aparecerá ninguno de los 2 botones, únicamente lo hará el botón con la "x" de cerrar.

ShowInTaskbar: Mediante esta propiedad podremos controlar que determinado formulario aparezca o no en la barra de tareas de Windows. En una aplicación con múltiples formularios, si para cada uno de los que aparezca en pantalla, nos aparece también en la barra de tareas, al final la barra estará llena de aplicaciones. Podemos hacer que determinados formularios no aparezcan en ella colocando esta propiedad a False.

Icon: Nos permite modificar el icono que aparece a la izquierda de la barra del título de cualquier formulario, que es donde aparece el menú de control, para personalizarlo en nuestra aplicación

ControlBox: Controla la aparición del menú de control. Esta propiedad por defecto está activada, aunque si la ponemos a False, no sólo hacemos desaparecer el icono que simboliza al menú de control, sino que desaparecen también los botones de minimizar, maximizar y cerrar. Únicamente aparece la barra de titulo con el caption.

Si además de colocar ControlBox a False, colocamos MinButton y MaxButton a False y dejamos vacía la propiedad Caption, es decir sin nada en el título, nos aparecerá un formulario sin barra de titulo, es decir, únicamente un rectángulo gris que sí podremos cambiar de tamaño apuntando sobre el borde.

BorderStyle: Esta propiedad es la que más opciones tiene y la que más posibilidades ofrece para cambiar el aspecto de nuestros formularios. El cambiar el valor de esta propiedad afecta también a las propiedades MinButton, MaxButton y ShowInTaskbar que cambian automáticamente según la opción que hayamos seleccionado. En la siguiente tabla aparece una explicación de cada una de sus opciones y de que valor adoptan otras propiedades del formulario:

 

Opciones de BorderStyle

Utilidad

MinButton

MaxButton

ShowInTaskbar

Muestra

0- None

No aparecen bordes ni barra de titulo. No podemos modificar su tamaño de ninguna forma. Sirve para pantallas de presentación al principio de nuestra aplicación

False

False

False

1 - Fixed Single

No se puede cambiar su tamaño.Ni siquiera se puede maximizar haciendo doble click sobre la barra del título, algo que sí se puede hacer desactivando los botones MinButton y MaxButton en un formulario normal

False

False

True

2 - Sizable (aparece por defecto)

Formulario por defecto de VB.Contiene todos los botones de la barra del título, se puede cambiar su tamaño actuando sobre el borde y aparece en la barra de tareas.

True

True

True

3 - Fixed Dialog

No se puede cambiar su tamaño y no aparece en la barra de tareas

False

False

False

4 - Fixed ToolWindow

Aparece con la barra de titulo más pequeña, es el que utiliza VB para mostrar la caja de herramientas. No aparece el icono del menú de control ni aparece en la barra de tareas.

False

False

False

5 - Sizable ToolWindow

Igual que el anterior pero sí permite modificar su tamaño actuando sobre el borde.

False

False

False

 

5.2. Utilización de multiples formularios

Para utilizar varios formularios en nuestra aplicación tendremos que añadir cada uno de ellos mediante la opción de menú Insert / Form o pulsando sobre el botón .

Método Show

Para llamar a un formulario desde el código utilizaremos el método Show. Si el formulario 2 tiene en la propiedad Name form2, para llamarlo desde otro formulario pondremos:                      Form2.Show

Si no ponemos ningún argumento se asume que el formulario aparece en modo no modal, es decir, se permitirá que se active cualquier otro formulario sin cerrar el formulario 2. La otra modalidad que existe es modal, lo que significa que no se permite el enfoque hacia ningún otro formulario hasta que no se cierre el actual. Este último modo puede servir para cuadros de diálogo que soliciten ciertos parámetros para que la aplicación siga funcionando: una contraseña.

Los argumentos del método Show son:

0                   vbModeless                      No modal

1                   vbModal                            Modal

Ejemplo:          Form2.Show vbModal

Sentencia Load

La sentencia Load seguida del nombre de un formulario provoca que se cargue el formulario en memoria pero sin visualizarse, ya que la propiedad Visible se coloca a False.

Ejemplo:          Load Form2

Realmente el método Show realiza la carga del formulario en memoria, si no estaba cargado antes, y coloca la propiedad Visible del formulario a True. Durante este proceso se provoca la activación de los eventos Load y Activate del formulario en ese orden. En dichos eventos se puede colocar el código necesario que haga que el formulario se inicie siempre con los valores que queramos.

Si el formulario ya estaba cargado en memoria, mediante una sentencia Load o porque se haya ocultado con el método Hide, al llamarlo con el método Show, únicamente se realizará la modificación de la propiedad Visible a True, y no se volverá a efectuar el proceso de carga del formulario a memoria. Por tanto el formulario aparecerá con los mismos datos que tenía cuando se ocultó. Ahora el único evento que se activará es el Activate que se activa cada vez que un formulario recibe el enfoque o pasa a ser el formulario activo.

Sentencia Unload

Nos permite descargar un formulario de la memoria. Se introduce junto al nombre del formulario que vayamos a descargar:                        Unload Form2

Si nos encontramos dentro del mismo formulario para descargarlo no hace falta colocar el nombre sino únicamente:                Unload me

En una aplicación con varios formularios debemos usar esta sentencia para los métodos que terminamos de utilizar, de esta forma liberaremos espacio en memoria para que los otros formularios puedan aprovecharla mejor. La sentencia unload provoca la activación de los eventos:

·       Deactivate: Al contrario que el evento Activate, éste se activa cada vez que un formulario pierde el enfoque. También se activa este evento al utilizar el método Hide.

·       Unload: Este evento recibe el parámetro Cancel, y modificando su valor podemos hacer que se suspenda (cancele) el proceso de descarga de un formulario. Mediante 2 líneas de código podemos hacer una pregunta al usuario cada vez que se cierra un formulario para que nos confirme la operación:

Este código provocará que cada vez que se cierre el formulario de cualquier forma, (no sólo mediante la sentencia Unload sino también haciendo click sobre la "x", el menú de control o con ALT + F4) aparezca un mensaje preguntándonos si realmente queremos salir:

 

 

 

·     Query_Unload: Este evento se produce realmente antes que el evento Unload.

En este evento además de recoger el parámetro Cancel, también nos proporciona el parámetro UnloadMode que según el valor que tenga podremos saber desde donde se produce la posible descarga del formulario. Los valores que puede tener son los siguientes:

0 - vbFormControlMenu: Significa que el cierre del formulario se ha producido:

·    Pulsando sobre la "x"

·    Mediante la opción cerrar del Menú de Control.

·    Pulsando ALT + F4.

·    Cerrando el formulario desde la Barra de Tareas.

1 - vbFormCode: Indica que se ha cerrado el formulario utilizando la sentencia Unload.

2 - vbAppWindows: Se cierra el formulario porque se apaga el sistema desde Inicio / Apagar Sistema.

3 - vbAppTaskManager: Desde el administrador de tareas de windows (CTRL + ALT + DEL) se cierra la aplicación que contiene el formulario

4 - vbFormMDIForm: Se produce cuando se cierra un formulario hijo porque se está cerrando el formulario MDI que lo contiene.

Mediante unas líneas de código vamos a probar las posibilidades de este evento. Según desde donde se cierre el formulario del que consta la aplicación aparecerá un mensaje distinto pidiéndonos confirmación en el proceso de descarga.

Nota: Para el correcto funcionamiento de este ejemplo se debe compilar la aplicación mediante File / Make EXE File... y ejecutar la aplicación desde fuera del entorno de trabajo de VB.Esto es así para que se pueda cerrar la aplicación apagando el sistema y desde el administardor de tareas.

El código asociado al evento Query_Unload es el siguiente:

 

5.3. Comunicacion entre formularios

Desde un formulario se puede tener acceso a los controles y propiedades de otro formulario.

En lugar de realizar el paso de parámetros cuando se llama a otro formulario que queremos que aparezca con unos determinados valores iniciales, lo que se hace es acceder a los controles del otro formulario y después mostrarlo mediante el método Show.

Para acceder a los controles de otro formulario se sigue la siguiente sintaxis:

Formulario!Control.Propiedad = valor

Se debe colocar una admiración "!" entre el formulario y el control y un punto entre el control y la propiedad. Ejemplo:            Form2!Label1.Caption = "Número de Clientes"

Al acceder a las propiedades de otro formulario automáticamente se carga éste en memoria, si no lo estaba ya antes. Una vez que hayamos modificado sus propiedades los visualizaremos con el método Show.

 A V I S O :  No se puede acceder a las variables declaradas en otro formulario, de modo que si queremos trabajar con variables generales, las cuales sean accesibles desde cualquier formulario de la aplicación, tendremos que declararlas como Públicas desde un módulo de código.

Para insertar un módulo en nuestro proyecto tendremos que ejecutar el menú  ”Proyecto/Agregar Módulo” o pulsar sobre el botón    de la barra de herramientas. Nos aparecerá una ventana en la que únicamente podremos colocar las variables y procedimientos o funciones que queramos que sean públicas para toda la aplicación.

Ahora la ventana de proyecto tiene una línea más con un icono distinto indicando que se trata de un módulo de código:

 

 

 

6. Contantes y funciones de Visual Basic

6.1. Constantes

A continuación se detalla una lista con las constantes más usadas definidas en Visual Basic y su significado:

vbBlack                                  color negro

vbBlue                                    color azul

vbCyan                                   color azul celeste

vbGreen                                 color verde

vbMagenta                            color violeta

vbRed                                     color rojo

vbWhite                                  color blanco

vbYellow                                 color amarillo

 

vbYes                                     Si

vbNo                                       No

 

vbCrLf                                    Introduce un retorno de carro y un avance de línea. De esta forma podemos hacer que se comience a escribir en una nueva línea.

 

Las siguientes constantes se utilizan en los MsgBox para indicar la señal y los botones que se mostrarán:

vbCritical                               señal de error

vbExclamation                       señal de advertencia

vbInformation                        señal de información

vbQuestion                             señal de interrogación

vbOkOnly                              botón de aceptar

vbOkCancel                           botones aceptar y cancelar

vbYesNo                                botones Sí y No

vbYesNoCancel                     botones Sí, No y Cancelar

vbAbortRetryIgnore             botones Anular, Reintentar y Omitir

 

Para determinar que carácter se ha pulsado en el teclado podemos comprobar su código ASCII. Visual Basic nos facilita esta labor mediante estas constantes:

vbKeyUp                                flecha arriba

vbKeyDown                           flecha abajo

vbKeyLeft                              flecha izquierda

vbKeyRight                           flecha derecha

vbKeyReturn                         tecla Intro

vbKeyEscape                         tecla Escape

vbKeySpace                           tecla espacio

vbLeftButton                         botón izquierdo del ratón

vbRightButton                       botón derecho del ratón

Evidentemente hay muchas más, aunque no las expondremos aquí. Los cuatro primeros casos propuestos nos servirán para, por ejemplo, mover un objeto por la pantalla con la ayuda de las teclas de desplazamiento, como sucede en un juego.

 

Funciones

Una función nos servirá para realizar un cálculo u obtener un determinado valor. Entre las múltiples existentes podemos destacar las siguientes, agrupadas en categorías.

6.2. Funciones matemáticas

Abs(número)                                    Devuelve el valor absoluto de número

Sgn(número)                                    Indica el signo de número

Int(número)                                      Devuelve la parte entera de número

Sqr(número)                                     Halla la raíz cuadrada de número

Round(número, numdecimales)         Redondea número con las posiciones decimales indicadas

Sin(ángulo)                                       Seno de ángulo

Cos(ángulo)                                      Coseno de ángulo

Tan(ángulo)                                      Tangente de ángulo

6.3. Funciones aleatorias

Rnd                                         Devuelve un número aleatorio entre 0 y 1

Randomize                             Inicializa el generador aleatorio

6.4. Funciones de cadenas de caractéres

Left(cadena, num)                   Extrae num caracteres de cadena contando de izquierda a derecha

Right(cadena, num)                 Extrae num caracteres de cadena contando de derecha a izquierda

Mid(cadena, pos,  num)           Extrae num caracteres de cadena a partir de la posición pos

Len(cadena)                            Devuelve la longitud de la cadena

LCase(cadena)                       Convierte la cadena a minúsculas

UCase(cadena)                       Convierte la cadena a mayúsculas

6.5. Funciones de fechas

Date                                       Devuelve la fecha actual

Time                                       Devuelve la hora actual

Now                                        Devuelve la fecha y hora actuales

Day(Date)                              Devuelve el día del mes

WeekDay(Date)                    Devuelve el día de la semana en que nos encontramos, como número y teniendo en cuenta que el 1 es el Domingo, 2 lunes, ...

Month(Date)                          Devuelve el mes en que estamos, como número

Year(Date)                             Devuelve el año

MonthName(num)                  Devuelve el nombre del mes que representa num.

WeekdayName(num)             Devuelve el día de la semana que representa num. Recordar que el 1 es el domingo, 2 lunes, ...

Hour(Time)                            Devuelve la hora

Minute(Time)                        Devuelve los minutos

Second(Time)                         Devuelve los segundos

6.6. Funciones de comprobación

IsNumeric(dato)                     Comprueba si un dato es numérico

IsDate(dato)                           Comprueba si un dato es de tipo fecha u hora

6.7. Otras funciones

Asc(carácter)                           Devuelve el código ASCII del carácter indicado

Chr(códigoASCII)                  Devuelve el carácter correspondiente al código ASCII indicado

Beep                                       Emite un pitido

Print                                        Imprime en pantalla el resultado de la expresión o valor que aparece a su derecha. Por defecto, la impresión tendrá lugar en el formulario. Si deseamos imprimir por ejemplo dentro de un PictureBox, tendremos que anteponer el nombre de éste antes de la instrucción Print, separados por un punto.

                                                Si queremos escribir varios datos en una misma línea, podemos utilizar los siguientes separadores entre unos y otros:

                                               

Separador

Resultado

, (coma)

los datos quedan separados por un tabulador

; (punto y coma)

los datos quedan separados por un único espacio en blanco

& (andpersand)

los datos se escriben unos junto a otros, sin separación

Ejemplos

Resultado en pantalla

Print 22, “hola”

22         hola

Print 22; “hola”

22 hola

Print 22 & “hola”

22hola

 

 

6.8. Las funciones InputBox y MsgBox

La función InputBox se utilizará cuando queramos que el usuario introduzca algún dato. Esta función presenta la siguiente sintaxis:

                            variable = InputBox (“mensaje”, [“titulo”], [“valor por defecto”])

donde variable es una variable de tipo String en la que se almacenará el dato introducido por el usuario, y mensaje es el mensaje que se mostrará en la ventana de entrada de datos. Los valores que aparecen entre corchetes es porque su inclusión en la función InputBox es opcional, por lo que pueden omitirse. Título representa el texto que aparecerá como cabecera en la ventana, y Valor por defecto es el valor que tomará la variable si el usuario no introduce ningún valor en la casilla correspondiente.

      El siguiente ejemplo

                            nombre = InputBox (“escriba su nombre”,”AVISO”)

mostraría la ventana de entrada de datos de la figura, y almacenaría el valor introducido por el usuario en la variable nombre (que debe ser de tipo String).

 

 

 

 

 

 

La función MsgBox permite mostrar un mensaje. La sintaxis de esta función es como en el siguiente ejemplo:

MsgBox “No se puede calcular el factorial de un número negativo”, _ vbCritical + vbOKOnly, “Error”

El resultado del ejemplo anterior sería una ventana como la que aparece a continuación. Como puede verse la función MsgBox lleva tres argumentos separados por comas; el primero de ellos es el cuerpo del mensaje, en el segundo se hace referencia tanto al dibujo que se mostrará como al botón o botones que aparecerán y en el último se indica el título de la ventana en la que aparece el mensaje.

La función MsgBox nos permite conocer que botón ha pulsado el usuario como respuesta al mensaje. Por ejemplo, una función MsgBox en la que aparecieran un botón SI junto a un botón NO (vbYesNo), tendría el valor vbYes si pulsamos el botón SI o el valor vbNo si el botón pulsado es NO. Veámoslo más claramente en el siguiente ejemplo

If MsgBox ("¿Realmente desea salir?", vbYesNo + vbExclamation, _ "ATENCION") = vbYes Then End

Esta línea de código hace que aparezca una ventana preguntándonos si deseamos salir del programa, en la que aparecerán los botones <Si> o <No>. Si pulsamos el botón <Si>, el programa finalizará (comando End).

Nota importante: conviene resaltar aquí que cuando una sentencia de Visual Basic es demasiado larga y no cabe en una línea, antes de comenzar a escribir la continuación de dicha sentencia en la línea inferior es necesario escribir el carácter de subrayado ( _ ) al finalizar la línea anterior como puede observarse en el último ejemplo.

Las distintas combinaciones de dibujos y botones que pueden mostrarse en un MsgBox se encuentran en el apartado 6.1. , aunque los repetiremos aquí:

vbCritical                               señal de error

vbExclamation                       señal de advertencia

vbInformation                        señal de información

vbQuestion                             señal de interrogación

vbOkOnly                              botón de aceptar

vbOkCancel                           botones aceptar y cancelar

vbYesNo                                botones Sí y No

vbYesNoCancel                     botones Sí, No y Cancelar

vbAbortRetryIgnore             botones Anular, Reintentar y Omitir

 

 

7. El editor de menús

Cuando queramos añadir a nuestros programas una barra de menús, la tarea será sencilla utilizando el editor de menús. Para activar el editor de menús debemos ir al menú Herramientas de Visual Basic y allí escoger la opción Editor de menús…, o bien hacer clic sobre el botón correspondiente  de la barra de herramientas Estandar. Aparecerá una ventana como la siguiente:

Caption: será el texto que aparecerá en el menú. Si se desea que alguna de las letras del menú sirva para acceder de forma rápida a dicho menú, se debe situar el carácter & antes de esa letra. Como se puede observar en cualquier programa Windows esto hará que ese carácter del menú aparezca subrayado. (Este mismo carácter & puede utilizarse de modo análogo en el caption de un CommandButton. Si pulsamos la combinación de teclas ‘ALT+ el carácter escogido’ será como hacer click con el ratón en dicho botón) Para incluir un separador entre distintas opciones del menú, esta propiedad debe ser – (un guión).

Name: es el nombre con el que nos referiremos al menú desde el código.

Shortcut: asocia una combinación de teclas para acceder al menú de forma abreviada.

Checked: determina si aparecerá o no una marca de verificación a la izquierda de la opción del menú.

Enabled: si esta casilla no está marcada, dicho menú no será accesible apareciendo difuminado.

Visible: determina si dicho elemento del menú podrá verse o no.

Estas tres últimas propiedades pueden modificarse en tiempo de ejecución estableciendo su valor a True o a False.

Cuando queramos que un menú esté dentro de otro, es decir, sea un submenú, no tendremos más que tabularlo en el editor de menús mediante el botón  del mismo.

El único evento disponible para un menú es Click , que corresponde a la selección de la opción, independientemente de que ésta se realice con el ratón o con el teclado.

Para crear un menú emergente o menú contextual no tememos más que crearlo como si se tratase de un menú normal y hacerlo invisible. Para abrirlo haremos uso del método PopupMenu, como se muestra en el siguiente ejemplo.

If Button = vbRightButton Then PopupMenu nombremenú